package acm;

import java.util.Arrays;
import java.util.Scanner;

//字母重排，给定一个字典，然后给定一些乱序的字母组成的单词，输出这些字母重排后在字典中出现的单词
//若没有，则输出:);
public class AlphabetResort {

	private static final int maxWord = 2000; // 字典中最大的单词数

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String[] dictionary = new String[maxWord];
		String string = scanner.next();
		int i = 0; // 最后i表示字典的实际长度
		// 先得到字典
		while (!string.substring(0, 1).equals("*")) {
			System.out.println(string);
			dictionary[i++] = string;
			string = scanner.next();
		}
		// 由于dictionary里面含有大量的未添加数据，如果这样排序，会导致报nullpointer
		// Arrays.sort(dictionary);
		String[] sortedDic = new String[i];
		for (int j = 0; j < i; j++) {
			sortedDic[j] = dictionary[j];
		}
		Arrays.sort(sortedDic); // 给所有的单词排序，按照字典的顺序排序
		System.out.println(sortedDic[0] + sortedDic[1] + sortedDic[2]);
		// 除此之外，还需要给单个单词按照字母表按照字母表的顺序排序
		// 由于不能直接颠倒顺序，因为后面还需输出，所以使用一个临时数组进行操作
		// 这样下是传递了引用
		// String[] sortedDicWord=sortedDic;
		String[] sortedDicWord = new String[sortedDic.length];
		System.arraycopy(sortedDic, 0, sortedDicWord, 0, sortedDic.length);
		for (int j = 0; j < i; j++) {
			char[] temp = sortedDicWord[j].toCharArray();
			Arrays.sort(temp);
			sortedDicWord[j] = String.valueOf(temp);
			System.out.print(sortedDicWord[j]);
		}
		// 得到输入的单词，同样
		char[][] word = new char[maxWord][10];
		int m = 0;
		while (scanner.hasNext()) {
			boolean found = false; // 用于标识是否找到，若未找到，输出:)
			word[m] = scanner.next().toCharArray();
			// 将每个输入的单词里面按照字母表的顺序排序，一旦发现与字典中的有相同的，即可输出
			Arrays.sort(word[m]);
			System.out.print(String.valueOf(word[m]) + " ");
			for (int n = 0; n < i; n++) {
				if (String.valueOf(word[m]).equals(sortedDicWord[n])) {
					System.out.print(sortedDic[n] + "");
					found = true;
				}
			}
			if (!found) {
				System.out.println(":)");
			}
			m++;
		}
		scanner.close();
	}
}
